package com.anolesoft.amljmes.perm.controller.userMenu;

import com.anolesoft.amljmes.perm.dto.userMenu.UiResourceDTO;
import com.anolesoft.amljmes.perm.service.userMenu.inf.UiResourceQueryService;
import com.anolesoft.common.core.web.domain.AjaxResult;
import com.anolesoft.common.security.util.SecurityUtils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author zhj
 * @date 2022/1/17 15:01
 */
@RestController
@RequestMapping("/user/nav")
@Slf4j
public class UserMenuController {
    @Resource
    private UiResourceQueryService uiResourceQueryService;

//    @Autowired
//    public void setUiResourceQueryService(UiResourceQueryService uiResourceQueryService) {
//        this.uiResourceQueryService = uiResourceQueryService;
//    }

    @GetMapping
    public AjaxResult listNavTree(){
        //List<String> permissions = SecurityUtils.getLoginUser().getPermissions();
        String empUid = SecurityUtils.getLoginUser().getEmpUid();
        log.info("permissions:{}", empUid );
//        String username = SecurityUtils.getLoginUser().getUsername();
//        List<UiResourceDTO> uiResourceDTOS = uiResourceQueryService.selectResources();
//        if (empUid.equals("admin")) {
//            System.out.println("超级管理员登录");
//        }
        List<String> list = uiResourceQueryService.selectResourcesByEmpUid(empUid);
        List<UiResourceDTO> uiResourceDTOS = uiResourceQueryService.selectResourceTree();
        List<UserMenuVO> menuVOS = uiResourceDTOS.stream().map(t->{
            MetaVO metaVO = MetaVO.builder()
                    .title(t.getTitle())
                    .icon(t.getIcon())
                    .target("")
                    .permission(t.getPermission())
                    .show(t.getShow())
                    .build();
            UserMenuVO userMenuVO = UserMenuVO.builder()
                    .component(t.getComponent()==null?"RouteView":t.getComponent())
                    .name(t.getName())
                    .id(t.getId())
                    .key(t.getId())
                    .parentId(t.getParentId()==null?"0":t.getParentId())
                    .redirect(t.getRedirect())
                    .path(t.getPath())
                    .meta(metaVO)
                    .resourceType(t.getResourceType())
                    .build();
            return userMenuVO;
        }).filter(t ->  "menu".equals(t.getResourceType()) || ("page".equals(t.getResourceType())&& validatePermission(t.getId(),list) ) )
                .collect(Collectors.toList());

        //进行过滤
//遍历所有元素，判断是否可见
        sign(menuVOS);
        menuVOS = menuVOS.stream().filter(t -> t.getIsShow()).collect(Collectors.toList());
//        if(1==1){
            MetaVO metaVO = MetaVO.builder()
                    .title("仪表盘")
                    .icon("dashboard")
                    .show(false)
                    .build();
            UserMenuVO menu = UserMenuVO.builder()
                    .component("RouteView")
                    .name("dashboard")
                    .id("1")
                    .key("1")
                    .parentId("0")
                    .path("/dashboard")
                    .redirect("/dashboard/workplace")
                    .meta(metaVO)
                    .resourceType("menu")
                    .build();
            menuVOS.add(0,menu);

            metaVO = MetaVO.builder()
                    .title("首页")
                    .icon("file")
                    .show(false)
                    .build();
            menu = UserMenuVO.builder()
                    .component("Workplace")
                    .name("workplace")
                    .id("7")
                    .key("7")
                    .path("/dashboard/workplace")
                    .parentId("1")
                    .meta(metaVO)
                    .resourceType("page")
                    .build();
            menuVOS.add(0,menu);
            return AjaxResult.success(menuVOS);
//        }

//        String ss = "[\n" +
//                "    {\n" +
//                "      'name': 'dashboard',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 1,\n" +
//                "      'meta': {\n" +
//                "        'icon': 'dashboard',\n" +
//                "        'title': '仪表盘',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'RouteView',\n" +
//                "      'redirect': '/dashboard/workplace'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'workplace',\n" +
//                "      'parentId': 1,\n" +
//                "      'id': 7,\n" +
//                "      'meta': {\n" +
//                "        'title': '工作台',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'Workplace'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'monitor',\n" +
//                "      'path': 'https://www.baidu.com/',\n" +
//                "      'parentId': 1,\n" +
//                "      'id': 3,\n" +
//                "      'meta': {\n" +
//                "        'title': '监控页（外部）',\n" +
//                "        'target': '_blank',\n" +
//                "        'show': true\n" +
//                "      }\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'Analysis',\n" +
//                "      'parentId': 1,\n" +
//                "      'id': 2,\n" +
//                "      'meta': {\n" +
//                "        'title': '分析页',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'Analysis',\n" +
//                "      'path': '/dashboard/analysis'\n" +
//                "    },\n" +
//                "\n" +
//                "    {\n" +
//                "      'name': 'form',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 10,\n" +
//                "      'meta': {\n" +
//                "        'icon': 'form',\n" +
//                "        'title': '表单页'\n" +
//                "      },\n" +
//                "      'redirect': '/form/base-form',\n" +
//                "      'component': 'PageView'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'basic-form',\n" +
//                "      'parentId': 10,\n" +
//                "      'id': 6,\n" +
//                "      'meta': {\n" +
//                "        'title': '基础表单'\n" +
//                "      },\n" +
//                "      'component': 'BasicForm'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'step-form',\n" +
//                "      'parentId': 10,\n" +
//                "      'id': 5,\n" +
//                "      'meta': {\n" +
//                "        'title': '分步表单'\n" +
//                "      },\n" +
//                "      'component': 'StepForm'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'advanced-form',\n" +
//                "      'parentId': 10,\n" +
//                "      'id': 4,\n" +
//                "      'meta': {\n" +
//                "        'title': '高级表单'\n" +
//                "      },\n" +
//                "      'component': 'AdvanceForm'\n" +
//                "    },\n" +
//                "\n" +
//                "    {\n" +
//                "      'name': 'list',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 10010,\n" +
//                "      'meta': {\n" +
//                "        'icon': 'table',\n" +
//                "        'title': '列表页',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/list/table-list',\n" +
//                "      'component': 'PageView'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'table-list',\n" +
//                "      'parentId': 10010,\n" +
//                "      'id': 10011,\n" +
//                "      'path': '/list/table-list/:pageNo([1-9]\\\\d*)?',\n" +
//                "      'meta': {\n" +
//                "        'title': '查询表格',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'TableList'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'basic-list',\n" +
//                "      'parentId': 10010,\n" +
//                "      'id': 10012,\n" +
//                "      'meta': {\n" +
//                "        'title': '标准列表',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'StandardList'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'card',\n" +
//                "      'parentId': 10010,\n" +
//                "      'id': 10013,\n" +
//                "      'meta': {\n" +
//                "        'title': '卡片列表',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'CardList'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'search',\n" +
//                "      'parentId': 10010,\n" +
//                "      'id': 10014,\n" +
//                "      'meta': {\n" +
//                "        'title': '搜索列表',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/list/search/article',\n" +
//                "      'component': 'SearchLayout'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'article',\n" +
//                "      'parentId': 10014,\n" +
//                "      'id': 10015,\n" +
//                "      'meta': {\n" +
//                "        'title': '搜索列表（文章）',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'SearchArticles'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'project',\n" +
//                "      'parentId': 10014,\n" +
//                "      'id': 10016,\n" +
//                "      'meta': {\n" +
//                "        'title': '搜索列表（项目）',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'SearchProjects'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'application',\n" +
//                "      'parentId': 10014,\n" +
//                "      'id': 10017,\n" +
//                "      'meta': {\n" +
//                "        'title': '搜索列表（应用）',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'SearchApplications'\n" +
//                "    },\n" +
//                "\n" +
//                "    {\n" +
//                "      'name': 'profile',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 10018,\n" +
//                "      'meta': {\n" +
//                "        'title': '详情页',\n" +
//                "        'icon': 'profile',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/profile/basic',\n" +
//                "      'component': 'RouteView'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'basic',\n" +
//                "      'parentId': 10018,\n" +
//                "      'id': 10019,\n" +
//                "      'meta': {\n" +
//                "        'title': '基础详情页',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'ProfileBasic'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'advanced',\n" +
//                "      'parentId': 10018,\n" +
//                "      'id': 10020,\n" +
//                "      'meta': {\n" +
//                "        'title': '高级详情页',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'ProfileAdvanced'\n" +
//                "    },\n" +
//                "\n" +
//                "    {\n" +
//                "      'name': 'result',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 10021,\n" +
//                "      'meta': {\n" +
//                "        'title': '结果页',\n" +
//                "        'icon': 'check-circle-o',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/result/success',\n" +
//                "      'component': 'PageView'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'success',\n" +
//                "      'parentId': 10021,\n" +
//                "      'id': 10022,\n" +
//                "      'meta': {\n" +
//                "        'title': '成功',\n" +
//                "        'hiddenHeaderContent': true,\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'ResultSuccess'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'fail',\n" +
//                "      'parentId': 10021,\n" +
//                "      'id': 10023,\n" +
//                "      'meta': {\n" +
//                "        'title': '失败',\n" +
//                "        'hiddenHeaderContent': true,\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'ResultFail'\n" +
//                "    },\n" +
//                "\n" +
//                "    {\n" +
//                "      'name': 'exception',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 10024,\n" +
//                "      'meta': {\n" +
//                "        'title': '异常页',\n" +
//                "        'icon': 'warning',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/exception/403',\n" +
//                "      'component': 'RouteView'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': '403',\n" +
//                "      'parentId': 10024,\n" +
//                "      'id': 10025,\n" +
//                "      'meta': {\n" +
//                "        'title': '403',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'Exception403'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': '404',\n" +
//                "      'parentId': 10024,\n" +
//                "      'id': 10026,\n" +
//                "      'meta': {\n" +
//                "        'title': '404',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'Exception404'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': '500',\n" +
//                "      'parentId': 10024,\n" +
//                "      'id': 10027,\n" +
//                "      'meta': {\n" +
//                "        'title': '500',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'Exception500'\n" +
//                "    },\n" +
//                "\n" +
//                "    {\n" +
//                "      'name': 'account',\n" +
//                "      'parentId': 0,\n" +
//                "      'id': 10028,\n" +
//                "      'meta': {\n" +
//                "        'title': '个人页',\n" +
//                "        'icon': 'user',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/account/center',\n" +
//                "      'component': 'RouteView'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'center',\n" +
//                "      'parentId': 10028,\n" +
//                "      'id': 10029,\n" +
//                "      'meta': {\n" +
//                "        'title': '个人中心',\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'component': 'AccountCenter'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'settings',\n" +
//                "      'parentId': 10028,\n" +
//                "      'id': 10030,\n" +
//                "      'meta': {\n" +
//                "        'title': '个人设置',\n" +
//                "        'hideHeader': true,\n" +
//                "        'hideChildren': true,\n" +
//                "        'show': true\n" +
//                "      },\n" +
//                "      'redirect': '/account/settings/base',\n" +
//                "      'component': 'AccountSettings'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'BaseSettings',\n" +
//                "      'path': '/account/settings/base',\n" +
//                "      'parentId': 10030,\n" +
//                "      'id': 10031,\n" +
//                "      'meta': {\n" +
//                "        'title': '基本设置',\n" +
//                "        'show': false\n" +
//                "      },\n" +
//                "      'component': 'BaseSettings'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'SecuritySettings',\n" +
//                "      'path': '/account/settings/security',\n" +
//                "      'parentId': 10030,\n" +
//                "      'id': 10032,\n" +
//                "      'meta': {\n" +
//                "        'title': '安全设置',\n" +
//                "        'show': false\n" +
//                "      },\n" +
//                "      'component': 'SecuritySettings'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'CustomSettings',\n" +
//                "      'path': '/account/settings/custom',\n" +
//                "      'parentId': 10030,\n" +
//                "      'id': 10033,\n" +
//                "      'meta': {\n" +
//                "        'title': '个性化设置',\n" +
//                "        'show': false\n" +
//                "      },\n" +
//                "      'component': 'CustomSettings'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'BindingSettings',\n" +
//                "      'path': '/account/settings/binding',\n" +
//                "      'parentId': 10030,\n" +
//                "      'id': 10034,\n" +
//                "      'meta': {\n" +
//                "        'title': '账户绑定',\n" +
//                "        'show': false\n" +
//                "      },\n" +
//                "      'component': 'BindingSettings'\n" +
//                "    },\n" +
//                "    {\n" +
//                "      'name': 'NotificationSettings',\n" +
//                "      'path': '/account/settings/notification',\n" +
//                "      'parentId': 10030,\n" +
//                "      'id': 10034,\n" +
//                "      'meta': {\n" +
//                "        'title': '新消息通知',\n" +
//                "        'show': false\n" +
//                "      },\n" +
//                "      'component': 'NotificationSettings'\n" +
//                "    }\n" +
//                "  ]";
//        Type listType =
//                new TypeToken<ArrayList<UserMenuVO>>(){}.getType();
////        UserMenuVO userMenuVO = new Gson().fromJson(ss, listType);
//        List<UserMenuVO> menus = new Gson().fromJson(ss, listType);
//        return AjaxResult.success(menus);
    }

    private boolean validatePermission(String id,List<String> list) {
        //todo 判断是否具有权限
//        String empUid = SecurityUtils.getLoginUser().getEmpUid();
        String empId = SecurityUtils.getLoginUser().getEmpUid();
        if(empId.contains("admin")){
            return true;
        }else{
            if (list.contains(id)){
                return true;
            }else{
                return false;
            }
        }
    }

    private void sign(List<UserMenuVO> menuVOS) {
        for (UserMenuController.UserMenuVO menuVO : menuVOS) {
            Boolean isShow = menuVO.getIsShow();

            String resourceType = menuVO.getResourceType();
            String parentId = menuVO.getParentId();

            if("page".equals(resourceType)){
                //查找它的父id，标记为可显示
                menuVO.setIsShow(Boolean.TRUE);
                setParent(parentId, menuVOS);
            }
        }
    }
    private void setParent(String parentId, List<UserMenuVO> menuVOS){
        if(!"0".equals(parentId)){
            UserMenuController.UserMenuVO userMenuVO = getUserMenuVO(parentId,menuVOS);
            userMenuVO.setIsShow(true);
            setParent(userMenuVO.getParentId(),menuVOS);
        }
    }
    private UserMenuController.UserMenuVO getUserMenuVO(String id, List<UserMenuVO> menuVOS){
        int index = menuVOS.indexOf(UserMenuController.UserMenuVO.builder().id(id).build());
        return menuVOS.get(index);
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UserMenuVO {
        private String name;
        private String parentId;
        private String id;
        private String component;
        private String redirect;
        private MetaVO meta;
        private String title;
        private String key;
        private String path;
        private String resourceType;
        @Builder.Default
        private Boolean isShow = Boolean.FALSE;

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            UserMenuVO that = (UserMenuVO) o;
            return id.equals(that.id);
        }

        @Override
        public int hashCode() {
            return Objects.hash(id);
        }
    }
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class MetaVO {
        private String icon;
        private String title;
        private Boolean show;
        private String target;
        private String permission;
    }

}
